package com.birdboot.core;

import com.birdboot.http.HttpServletRequest;
import com.birdboot.http.HttpServletResponse;

import java.io.File;
import java.lang.reflect.Method;
import java.net.URISyntaxException;

/**
 * 该类是SpringMVC框架与Tomcat整合时的一个关键类
 * Tomcat处理业务原生的都是调用继承了HttpServlet的类来完成，此时需要进行很多配置
 * 以及使用时要作很多重复性劳动。
 * SpringMVC框架提供的该类也是继承了HttpServlet的，使用它来接收处理请求的工作。
 */
public class DispatcherServlet {
    //这两个目录是固定的，因此定义为静态的，全局一份即可
    private static File baseDir;//类加载路径
    private static File staticDir;//类加载路径下的static目录

    private static DispatcherServlet instance = new DispatcherServlet();

    private DispatcherServlet() {
    }

    static {
        try {
            baseDir = new File(
                    ClientHandler.class.getClassLoader().getResource(".").toURI()
            );
            staticDir = new File(baseDir, "static");
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
    }


    //实际上一个类继承了HttpServlet要重写方法:service,该方法用于处理请求
    public void service(HttpServletRequest request, HttpServletResponse response) {
        //不能再使用uri作为请求路径判断了，因为可能包含参数，而参数内容不是固定值
        String path = request.getRequestURI();
        System.out.println("请求路径:" + path);

        //首先判断是否为业务
        Method method = HandlerMapping.getMethod(path);
        if(method!=null){//如果获取到方法说明本次请求为处理业务
            try {
                Class cls = method.getDeclaringClass();//根据当前方法对象获取该方法所属的类
                method.invoke(cls.newInstance(),request,response);
            } catch (Exception e) {
                //处理业务如果出现异常，则应当给浏览器响应500，告知
                response.setStatusCode(500);
                response.setStatusReason("Internal Server Error");
            }
        }else {
            File file = new File(staticDir, path);
            if (file.isFile()) {
                response.setStatusCode(200);
                response.setStatusReason("OK");
                response.setContentFile(file);
                response.addHeader("Server", "BirdWebServer");
            } else {
                response.setStatusCode(404);
                response.setStatusReason("NotFound");
                file = new File(staticDir, "404.html");
                response.setContentFile(file);
                response.addHeader("Server", "BirdWebServer");
            }
        }
    }

    public static DispatcherServlet getInstance() {
        return instance;
    }
}
